﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using FirmaKurierska.Models;
using FirmaKurierska.Areas.Centrala.Models;
using System.Web.Security;

namespace FirmaKurierska.Areas.Centrala.Controllers
{
    public class TwojaFlotaController : Controller
    {
        private PlacowkaEntities db = new PlacowkaEntities();

        /// <summary>
        /// Wyświetla listę samochodów przypisanych do centrali
        /// </summary>
        /// <returns>Lista samochodów</returns>
        public ActionResult Index()
        {
            var context = new UsersContext();

            var samochody = db.Samochod.ToList();
            List<SamochodyModelView> samochodyView = new List<SamochodyModelView>();
            foreach(Samochod sam in samochody) {
                var samView = new SamochodyModelView(sam);
                samView.kierowcaLogin = "nie przypisano";
                try
                {
                    samView.kierowcaLogin = context.UserProfiles.Find(sam.kierowca_id).UserName.ToString();
                }
                catch (Exception) { }
                samochodyView.Add(samView);
            }

            return View(samochodyView);
        }

        /// <summary>
        /// Przypisuje wolnego kierowce do samochodu
        /// </summary>
        /// <param name="id">Id samochodu</param>
        /// <param name="form">Formularz z wybranym kierowcą</param>
        /// <returns>Widok wszystkich samochodów</returns>
        [HttpPost, ActionName("PrzypiszKierowce")]
        [ValidateAntiForgeryToken]
        public ActionResult PrzypiszKierowce(int id, FormCollection form)
        {
            try
            {
                var samochod = (from n in db.Samochod where n.sid == id select n).Single();
                samochod.kierowca_id = Convert.ToInt16(form["Kierowca"].ToString());
                db.SaveChanges();
            }
            catch (Exception) { }

            return RedirectToAction("Index");
        }

        /// <summary>
        /// Wyświetla widok pozwalający na przypisanie kierowcy do samochodu
        /// </summary>
        /// <param name="id">Id samochodu</param>
        /// <returns>Widok wszystkich wolnych kierowców</returns>
        public ActionResult PrzypiszKierowce(int id) {

            var context = new UsersContext();
            var users = context.UserProfiles.ToList();
            string uzytkownik = User.Identity.Name;
            var user = (from n in users where n.UserName.Equals(uzytkownik) select n).Single();

            //Wybranie uzytkownikow centrali
            var uzytkownicyCentrali = (from n in users where n.CentralaId == user.CentralaId select n).ToList();
            List<UserProfile> kierowcy = new List<UserProfile>();

            //wybranie kierowców wśród użytkowników centrali
            foreach (var kierowca in uzytkownicyCentrali)
            {
                try
                {
                    if (Roles.IsUserInRole(kierowca.UserName, "Kierowca"))
                    {
                        kierowcy.Add(kierowca);
                    }
                }
                catch (Exception) { }
            }

            var wszystkieSam = db.Samochod.ToList();

            //Wybranie wolnych kierowców
            var samochody = (from n in db.Samochod where n.centrala_id == user.CentralaId select n).ToList();
            List<UserProfile> wolniKierowcy = new List<UserProfile>();
            foreach (var kierowca in kierowcy)
            {
                int index = -1;
                try
                {
                    index = (from n in samochody where n.kierowca_id == kierowca.UserId select n.sid).Single();
                }
                catch (Exception) { }

                if (index == -1)
                {
                    wolniKierowcy.Add(kierowca);
                }
            }

            //wyświetlenie wyniku
            WolnyKierowcaViewModel kierowcyView = new WolnyKierowcaViewModel(wolniKierowcy);
            kierowcyView.samochodID = id;

            return View(kierowcyView);
        }

        /// <summary>
        /// Pozwala na zrealizowanie wybranego zlecenia przejazdu
        /// </summary>
        /// <param name="id">Id przejazdu</param>
        /// <returns>Widok wszsytkich samochodów</returns>
        public ActionResult Zrealizuj(int id = 0)
        {
            Alg_jednobazowy przejazd = (from n in db.Alg_jednobazowy where n.Jednobazowy_id == id select n).Single();
            przejazd.Zrealizowane = true;
            przejazd.Paczka.data_odebrania = DateTime.Now;
            przejazd.Paczka.status = przejazd.Paczka.status + 1;
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        /// <summary>
        /// Usuwa przypisanego kierowcę do auta
        /// </summary>
        /// <param name="id">Id kierowcy</param>
        /// <returns>Widok wszsytkich aut</returns>
        public ActionResult UsunKierowce(int id = 0)
        {
            try
            {
                db.Samochod.Find(id).kierowca_id = -1;
                db.SaveChanges();
            }
            catch (Exception) { }
            return RedirectToAction("Index");
        }

        /// <summary>
        /// Wyświetla listę przesyłek przypisanych aktualnie do samochodu
        /// </summary>
        /// <param name="id">Id samochodu</param>
        /// <returns>Lista przesyłek</returns>
        public ActionResult Details(int id = 0)
        {
            Samochod samochod = db.Samochod.Find(id);
            List<Alg_jednobazowy> zlecenia = (from n in db.Alg_jednobazowy where n.SamochodID == id && n.Zrealizowane==false select n).ToList();         
            return View(zlecenia);
        }
        
        /// <summary>
        /// Wyświetla formularz do tworzenia nowego auta
        /// </summary>
        /// <returns>Widok formularza</returns>
        public ActionResult Create()
        {
            return View();
        }
        
        /// <summary>
        /// Tworzy nowy samochód
        /// </summary>
        /// <param name="samochod">Model samochodu</param>
        /// <returns>Widok wszystkich samochodów</returns>
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(Samochod samochod)
        {
            var context = new UsersContext();

            if (ModelState.IsValid)
            {
                samochod.sid = 0;
                samochod.kierowca_id = -1;
                samochod.centrala_id = (from n in context.UserProfiles where n.UserName == User.Identity.Name select n.UserId).Single();
                db.Samochod.Add(samochod);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(samochod);
        }

        /// <summary>
        /// Wyświetla formularz do edycji samochodu
        /// </summary>
        /// <param name="id">Id samochodu</param>
        /// <returns>Widok wszystkich samochodów</returns>
        public ActionResult Edit(int id = 0)
        {
            Samochod samochod = db.Samochod.Find(id);
            if (samochod == null)
            {
                return HttpNotFound();
            }
            return View(samochod);
        }

        /// <summary>
        /// Zmienia dane samochodu
        /// </summary>
        /// <param name="samochod">Model samochodu</param>
        /// <returns>Widok wszsytkich samochodów</returns>
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(Samochod samochod)
        {
            if (ModelState.IsValid)
            {
                var sam = (from n in db.Samochod where n.sid == samochod.sid select n).Single();
                sam.ladownosc = samochod.ladownosc;
                sam.nr_rejsetracyjny = samochod.nr_rejsetracyjny;
                sam.obciazenie = samochod.obciazenie;
                sam.w_bazie = samochod.w_bazie;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(samochod);
        }

        /// <summary>
        /// Wyświetla formularz do usuwania samochodu
        /// </summary>
        /// <param name="id">Id samochodu</param>
        /// <returns>Szczególy samochodu</returns>
        public ActionResult Delete(int id = 0)
        {
            Samochod samochod = db.Samochod.Find(id);
            if (samochod == null)
            {
                return HttpNotFound();
            }
            return View(samochod);
        }

       /// <summary>
       /// Usuwa samochód
       /// </summary>
       /// <param name="id">Id samochodu</param>
       /// <returns>Lista wszsytkich aut</returns>
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            Samochod samochod = db.Samochod.Find(id);
            db.Samochod.Remove(samochod);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}